home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga CD-Sensation: Golden Games
/
Amiga CD-Sensation - Ausgabe 2 - Golden Games (1996)(GTI - Schatztruhe)(DE)[!].iso
/
Brain Activity
/
Rubik
/
source
/
rubik.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-08-11
|
10KB
|
458 lines
/* rubik.c */
/* started 23-Dec-89 */
/* Declarations for CBACK */
extern BPTR _Backstdout; /* std output when run in background */
long _BackGroundIO = 1; /* Flag to tell it we want to do I/O */
long _stack = 4000; /* Amount of stack space task needs */
char *_procname = "Rubik"; /* The name of the task to create */
long _priority = 0; /* The priority to run us at */
struct points point; /* holds posn.s of all points */
struct points start;
struct one_square square[56]; /* 54 on cube plus 2 inter-planes */
struct coord *temp;
struct Window *wnd1 = NULL;
struct Window *wnd2 = NULL;
struct Window *window;
struct Screen *scr1 = NULL;
struct Screen *scr2 = NULL;
struct Screen *screen;
struct IntuiMessage *msg = NULL;
extern struct IntuiMessage *solve();
extern struct Gadget fastergadget,slowergadget;
extern struct Gadget normalgadget,solvegadget,setupgadget;
/* size is half the side length of a SMALL cube...1/6 of whole cube */
unsigned short size;
short mode;
int viewdist;
short xcent,ycent;
short alpha,beta,gamma,delta;
unsigned short scaling;
extern int clockwise (int);
extern int whatsquare (int, int);
extern int paints (int, int, int);
extern short waiting_output;
extern void init_squares();
extern void init_points();
extern void init_trig();
extern void cleanup();
extern void getwindow();
extern void roll (short);
extern void yaw (short);
extern void pitch (short);
extern void twist (short, short);
extern void draw_square(int);
extern void showcube (short, short, short, short, short, short);
extern void findangles (short *, short *, short *);
extern void addpaints();
extern void removepaints();
extern void selectpen(int);
extern void modcolours(int, int, int);
extern void helpblurb();
extern void aboutblurb();
void swap (int i)
{
temp = square[i].corner[1];
square[i].corner[1] = square[i].corner[3];
square[i].corner[3] = temp;
}
void showit (short *alpha, short *beta, short *gamma)
{
ReplyMsg((struct Message *) msg);
findangles(alpha,beta,gamma);
showcube (*alpha,*beta,*gamma,0,0,0);
}
void select (short mode) /* pseudo mutual exclude */
{
int i;
for (i=0; i<3; i++)
{
SetDrMd (wnd1->RPort,JAM1);
SetDrMd (wnd2->RPort,JAM1);
if (i == mode)
{
SetAPen(wnd1->RPort,7);
SetAPen(wnd2->RPort,7);
}
else
{
SetAPen(wnd1->RPort,0);
SetAPen(wnd2->RPort,0);
}
RectFill (wnd1->RPort,198,114+12*i,252,124+12*i);
RectFill (wnd2->RPort,198,114+12*i,252,124+12*i);
SetDrMd (wnd1->RPort,COMPLEMENT);
SetDrMd (wnd2->RPort,COMPLEMENT);
switch (i)
{
case 0:
Move(wnd1->RPort,202,122);
Text(wnd1->RPort,"NORMAL",6);
Move(wnd2->RPort,202,122);
Text(wnd2->RPort,"NORMAL",6);
break;
case 1:
Move(wnd1->RPort,206,134);
Text(wnd1->RPort,"SOLVE",5);
Move(wnd2->RPort,206,134);
Text(wnd2->RPort,"SOLVE",5);
break;
case 2:
Move(wnd1->RPort,206,146);
Text(wnd1->RPort,"SETUP",5);
Move(wnd2->RPort,206,146);
Text(wnd2->RPort,"SETUP",5);
break;
}
}
SetDrMd (wnd1->RPort,JAM1);
SetDrMd (wnd2->RPort,JAM1);
}
struct IntuiMessage *getmsg()
{
if
(
(msg = (struct IntuiMessage *) GetMsg(wnd1->UserPort)) ||
(msg = (struct IntuiMessage *) GetMsg(wnd2->UserPort))
)
;
return (msg);
}
void showtwist (short i, short j)
{
showcube (alpha,beta,gamma,i,j,delta);
}
void _main (char *cmd)
{
int i,j;
int pen;
size = 2048;
scaling = 7;
viewdist = (2 << (scaling-3)) * size;
init_trig();
getwindow();
init_squares();
init_points();
SetOPen(wnd1->RPort,0);
SetOPen(wnd2->RPort,0);
window = wnd1;
screen = scr1;
xcent = 96;
ycent = 104;
delta = 15; /* degrees of twist per frame */
alpha = 0;
beta = 45;
gamma = 30;
/* make those squares that we can initialy see clockwise */
point = start;
for (i=0; i<54; i++)
{
if (clockwise(i))
{
if (i > 8)
swap (i);
}
else /* anticlockwise */
{
if (i < 9)
swap (i);
}
}
showcube (alpha,beta,gamma,0,0,0);
select (mode = 0);
waiting_output = 0;
for (;;) /* forever */
{
if (mode == 1)
{
msg = solve();
if (msg == NULL)
select (mode = 0);
}
else
msg = getmsg();
if (msg)
{
switch (msg->Class)
{
case CLOSEWINDOW:
ReplyMsg((struct Message *) msg);
cleanup();
Close (_Backstdout);
exit(0L);
break;
case GADGETUP:
switch (((struct Gadget *) msg->IAddress)->GadgetID)
{
case 1:
roll (delta);
showit (&alpha,&beta,&gamma);
break;
case 2:
roll ((short) -delta);
showit (&alpha,&beta,&gamma);
break;
case 3:
yaw (delta);
showit (&alpha,&beta,&gamma);
break;
case 4:
yaw ((short) -delta);
showit (&alpha,&beta,&gamma);
break;
case 5:
pitch (delta);
showit (&alpha,&beta,&gamma);
break;
case 6:
pitch ((short) -delta);
showit (&alpha,&beta,&gamma);
break;
case 7: /* front */
alpha = 0;
beta = 45;
gamma = 30;
ReplyMsg((struct Message *) msg);
showcube (alpha,beta,gamma,0,0,0);
break;
case 8: /* back */
alpha = 0;
beta = -135;
gamma = -30;
ReplyMsg((struct Message *) msg);
showcube (alpha,beta,gamma,0,0,0);
break;
case 9: /* faster */
ReplyMsg((struct Message *) msg);
if (delta == 5)
delta = 15;
else if (delta == 15)
delta = 30;
else
{
delta = 45;
OffGadget(&fastergadget,wnd1,NULL);
OffGadget(&fastergadget,wnd2,NULL);
}
OnGadget(&slowergadget,wnd1,NULL);
OnGadget(&slowergadget,wnd2,NULL);
break;
case 10: /* slower */
ReplyMsg((struct Message *) msg);
if (delta == 45)
delta = 30;
else if (delta == 30)
delta = 15;
else
{
delta = 5;
OffGadget(&slowergadget,wnd1,NULL);
OffGadget(&slowergadget,wnd2,NULL);
}
OnGadget(&fastergadget,wnd1,NULL);
OnGadget(&fastergadget,wnd2,NULL);
break;
case 11: /* help */
ReplyMsg((struct Message *) msg);
helpblurb();
while ((msg = getmsg()) == NULL)
Delay (1);
ReplyMsg((struct Message *) msg);
showcube (alpha,beta,gamma,0,0,0);
break;
case 12: /* about */
ReplyMsg((struct Message *) msg);
aboutblurb();
while ((msg = getmsg()) == NULL)
Delay (1);
ReplyMsg((struct Message *) msg);
showcube (alpha,beta,gamma,0,0,0);
break;
case 13: /* normal */
ReplyMsg((struct Message *) msg);
if (mode == 2)
removepaints();
select(mode = 0);
SetDrMd(wnd1->RPort,JAM1);
SetAPen(wnd1->RPort,0);
RectFill(wnd1->RPort,190,150,317,197);
ClipBlit
(
wnd1->RPort,190,150,
wnd2->RPort,190,150,
128,48,
0xc0
);
break;
case 14: /* solve */
ReplyMsg((struct Message *) msg);
if (mode == 2)
removepaints();
select(mode = 1);
break;
case 15: /* setup */
if (mode != 2)
{
SetDrMd(wnd1->RPort,JAM1);
SetAPen(wnd1->RPort,0);
RectFill(wnd1->RPort,190,150,317,197);
ClipBlit
(
wnd1->RPort,190,150,
wnd2->RPort,190,150,
128,48,
0xc0
);
addpaints();
pen = 1;
}
ReplyMsg((struct Message *) msg);
select(mode = 2);
break;
case 16: /* redplus */
case 17: /* greenplus */
case 18: /* blueplus */
case 19: /* redminus */
case 20: /* greenminus */
case 21: /* blueminus */
i =
(
((struct Gadget *)msg->IAddress)->GadgetID
)
-16;
ReplyMsg((struct Message *) msg);
if (mode == 2)
{
if (i > 2)
modcolours(pen, i-3, -1);
else
modcolours(pen, i, +1);
}
break;
case 22:
case 23:
case 24:
case 25:
case 26:
case 27: /* choosing pen colour */
if (mode == 2)
pen =
(
((struct Gadget *)msg->IAddress)
->GadgetID
)
-21;
ReplyMsg((struct Message *) msg);
if (mode == 2)
selectpen(pen);
break;
default:
ReplyMsg((struct Message *) msg);
break;
}
break;
case MOUSEBUTTONS:
if (msg->Code == SELECTDOWN || msg->Code == MENUDOWN)
{
if (mode == 0)
{
if ((i = whatsquare(msg->MouseX,msg->MouseY)) >=0)
{
/* make i = layer to twist, j = direction */
j = msg->Code == SELECTDOWN ? 1: -1;
if ((i /= 9) == 1 || i == 2 || i == 4)
j = -j;
showtwist ((short) i,(short) j);
waiting_output = 0;
}
}
else if (mode == 2)
{
if ((i = paints(msg->MouseX,msg->MouseY,pen)) >=0)
{
(square[i]).colour = pen;
waiting_output = 0;
}
}
}
ReplyMsg((struct Message *) msg);
break;
default:
ReplyMsg((struct Message *) msg);
break;
}
}
else
Delay (1); /* give other tasks a chance */
}
}